package middle;

/**
 * 请你判断一个9 x 9 的数独是否有效。只需要 根据以下规则 ，验证已经填入的数字是否有效即可。
 *
 * 数字1-9在每一行只能出现一次。
 * 数字1-9在每一列只能出现一次。
 * 数字1-9在每一个以粗实线分隔的3x3宫内只能出现一次。（请参考示例图）
 *
 * 注意：
 * 一个有效的数独（部分已被填充）不一定是可解的。
 * 只需要根据以上规则，验证已经填入的数字是否有效即可。
 * 空白格用'.'表示。
 */
public class leetcode36 {
    public static void main(String[] args) {
        char[][] sudu = {{'.','.','.','.','.','.','5','.','.'},
                         {'.','.','.','.','.','.','.','.','.'},
                         {'.','.','.','.','.','.','.','.','.'},
                         {'9','3','.','.','2','.','4','.','.'},
                         {'.','.','7','.','.','.','3','.','.'},
                         {'.','.','.','.','.','.','.','.','.'},
                         {'.','.','.','3','4','.','.','.','.'},
                         {'.','.','.','.','.','3','.','.','.'},
                         {'.','.','.','.','.','5','2','.','.'}};
        System.out.println(isValidSudoku(sudu));
    }
    public static boolean isValidSudoku(char[][] board) {
        int[][] rows = new int[9][9];
        int[][] columns = new int[9][9];
        int[][][] subboxes = new int[3][3][9];
        for (int i = 0; i < 9; i++) {
            for (int j = 0; j < 9; j++) {
                char c = board[i][j];
                if (c != '.') {
                    int index = c - '0' - 1;
                    rows[i][index]++;
                    columns[j][index]++;
                    subboxes[i / 3][j / 3][index]++;
                    if (rows[i][index] > 1 || columns[j][index] > 1 || subboxes[i / 3][j / 3][index] > 1) {
                        return false;
                    }
                }
            }
        }
        return true;
    }
        /*HashSet<Character> rowSet = new HashSet<>();
        HashSet<Character> columnSet = new HashSet<>();
        HashSet<Character> nineSet = new HashSet<>();
        int column = 0;
        int row = 0;
        for (int i = 0; i < board.length; i++) {
            for (int j = 0; j < board.length; j++) {
                if (board[i][j] != '.'){
                    if (!rowSet.add(board[i][j])){return false;}
                }
                if (board[row][column] != '.'){
                    if (!columnSet.add(board[row][column])){return false;}
                }
                row++;
            }
            column++;
            row = 0;
            columnSet.clear();
            rowSet.clear();
        }
        column = 0;
        int bound = 0;
        int count = 0;
        for (int i = 1; i <= board.length / 3; i++) {
            column = bound;
            while (row < 8){
                if (count % 3 == 0 && count != 0){
                    column = bound;
                    row++;
                }
                if (count % 9 == 0){
                    System.out.println("=============");
                    nineSet.clear();
                }
                if (board[row][column] != '.'){
                    boolean flag = nineSet.add(board[row][column]);
                    if (!flag){return false;}
                }
                System.out.println(board[row][column]);
                column++;
                count++;
            }
            System.out.println(count);
            System.exit(0);
            nineSet.clear();
            row = 0;
            bound = i * 3;
        }
        return true;
    }*/
}
